﻿using System;
using System.Web;
using BO;
using Business;
using Entity;
using Entity.Custom;
using Newtonsoft.Json;
using Utilities;

namespace FreshCms.BackEnd.Handler
{
    /// <summary>
    /// Summary description for News
    /// </summary>
    public class News : IHttpHandler, System.Web.SessionState.IRequiresSessionState
    {
        #region Declare variable for check pms
        Int32 ui = 0;
        InPms chkPms = new InPms();
        InUser CurrentUser = new InUser();
        #endregion

        public void ProcessRequest(HttpContext context)
        {
            string m = "";
            var response = new ResponseData();

            #region Get PanelId and Check Psm
            CurrentUser = InUserBusiness.GetSessionInUser();
            if (!string.IsNullOrEmpty(context.Request["ui"]))
            {
                Int32.TryParse(context.Request["ui"], out ui);
                if (ui > 0)
                    chkPms = InPmsBusiness.CheckSessionPms(ui);
                if (chkPms == null)
                    chkPms = new InPms { PmsView = 0, PmsUpdate = 0, PmsDelete = 0 };
            }
            #endregion



            if (context.Request.RequestType == "POST")
            {
                if (context.Request["m"] != null)
                    m = context.Request["m"];
                else
                    return;
            }
            else
            {
                if (context.Request.QueryString["m"] != null)
                    m = context.Request.QueryString["m"];
                else
                    return;
            }

            switch (m.ToLower())
            {
                case "add":
                    response = AddNew(context);
                    break;
                case "updatefast":
                    response = UpdateFast(context);
                    break;
                case "delete":
                    response = Delete(context);
                    break;
                case "recycle":
                    response = Recycle(context);
                    break;
                case "recover":
                    response = Recover(context);
                    break;

            }

            context.Response.ContentType = "application/x-javascript";

            string callBack = context.Request["callback"];
            if (!string.IsNullOrEmpty(callBack))
            {
                context.Response.Write(callBack + "( " + JsonConvert.SerializeObject(response) + " );");
            }
            else
                context.Response.Write(JsonConvert.SerializeObject(response));
        }


        private ResponseData AddNew(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsUpdate == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoUpdate, Success = false };

            var response = new ResponseData();

            if (!string.IsNullOrEmpty(context.Request["detail1"])
                && !string.IsNullOrEmpty(context.Request["title"])
                && !string.IsNullOrEmpty(context.Request["date"])
                && !string.IsNullOrEmpty(context.Request["time"])
                && !string.IsNullOrEmpty(context.Request["avatar"])
                && !string.IsNullOrEmpty(context.Request["cateid"])
                && !string.IsNullOrEmpty(context.Request["listonchild"])
                && !string.IsNullOrEmpty(context.Request["listonparent"])
                && !string.IsNullOrEmpty(context.Request["desc"])
                && !string.IsNullOrEmpty(context.Request["stt"]))
            {
                string detail1, title, date, time, author, listonChild, listonParent, desc, ava;
                Int32 stt = 0;
                Int32 cate = 0;
                Int32 id = 0;
                byte isHot = 0;
                byte isTop = 0;
                bool isVideo = false;
                bool isPhoto = false;
                Int32 isChangeListon = 0;

                if (!string.IsNullOrEmpty(context.Request["id"]))
                    Int32.TryParse(context.Request["id"], out id);
                detail1 = context.Request["detail1"];
                title = context.Request["title"];
                if (!string.IsNullOrEmpty(context.Request["author"]))
                    author = context.Request["author"];
                else
                    author = "";
    
                date = context.Request["date"];
                time = context.Request["time"];
                ava = context.Request["avatar"];
                Int32.TryParse(context.Request["cateid"], out cate);
                listonChild = context.Request["listonchild"];
                listonParent = context.Request["listonparent"];
                Int32.TryParse(context.Request["stt"], out stt);
                desc = context.Request["desc"];
                
                if (!string.IsNullOrEmpty(context.Request["ishot"]))
                    byte.TryParse(context.Request["ishot"], out isHot);
                if (!string.IsNullOrEmpty(context.Request["istop"]))
                    byte.TryParse(context.Request["istop"], out isTop);
                if (!string.IsNullOrEmpty(context.Request["isvideo"]))
                    isVideo = Utils.StringToBoolean(context.Request["isvideo"]);
                if (!string.IsNullOrEmpty(context.Request["isphoto"]))
                    isPhoto = Utils.StringToBoolean(context.Request["isphoto"]);
                if (!string.IsNullOrEmpty(context.Request["isUpdateListon"]))
                    Int32.TryParse(context.Request["isUpdateListon"], out isChangeListon);

                DateTime dPublish = new DateTime();
                dPublish = DateTime.ParseExact(date + " " + time, "d/M/yyyy h:m:s", null);

                var obj = new OutNew()
                {
                    NewId = id,
                    CatId = cate,
                    NewAuthor = author,
                    NewTitle = title,
                    NewDesc = desc,
                    NewDetail = detail1,
                    NewImage = ava,
                    NewImage2 = "",
                    NewImage3 = "",
                    NewStatus = stt,
                    NewPublishDate = dPublish,
                    NewModifiedDate = DateTime.Now,
                    UserId = CurrentUser.UserId,
                    NewVideo = isVideo,
                    NewPhoto = isPhoto,
                    NewHot = isHot,
                    NewTop = isTop
                };

                // ID>0 là UPDATE
                if (id > 0)
                {
                    #region UPDATE tin bai

                    Int32 returnVal = -1;
                    // Check neu User la SuperAdmin ( quyền sửa tất cả ) thì cho UPDATE luôn, không cần check UserID
                    if (CurrentUser.IsSuperAdmin == 1)
                        returnVal = OutNewBusiness.UpdateOutNew(obj);
                    else
                        returnVal = OutNewBusiness.UpdateOutNewWithRole(obj);
                    // UPDATE thanh cong
                    if (returnVal > -1)
                    {
                        response.Data = returnVal;
                        response.Success = true;

                        // Sau khi UPDATE thành công, check xem có phải update liston không?
                        if (isChangeListon == 1)
                        {
                            response.Message = "Call Update OK With change ListOn";
                            // Trước khi update liston thì xóa hết liston cũa của tin bài này đi
                            OutNewListOnBusiness.DeleteOutNewListOnByNewId(id);
                            // Insert ListOn cho Cate Child
                            var childs = listonChild.Split(',');
                            var objlo = new OutNewListOn();
                            foreach (var cateid in childs)
                            {
                                Int32 childId = 0;
                                Int32.TryParse(cateid, out childId);
                                if (childId > 0)
                                {
                                    objlo.CatId = childId;
                                    objlo.IsParent = 0;
                                    objlo.NewId = id;
                                    objlo.ListonId = 0;
                                    OutNewListOnBusiness.InsertOutNewListOn(objlo);
                                }
                            }

                            // Insert ListOn cho Cate Parent
                            var parents = listonParent.Split(',');
                            foreach (var cateid in parents)
                            {
                                Int32 parentId = 0;
                                Int32.TryParse(cateid, out parentId);
                                if (parentId > 0)
                                {
                                    objlo.CatId = parentId;
                                    objlo.IsParent = 1;
                                    objlo.NewId = id;
                                    objlo.ListonId = 0;
                                    OutNewListOnBusiness.InsertOutNewListOn(objlo);
                                }
                            }
                        }
                        else
                            response.Message = "Call Update OK, ListOn don't CHANGE";

                        // Ghi log hệ thống
                        InLogBusiness.InsertInLog(new InLog
                        {
                            UserId = CurrentUser.UserId,
                            LogAction = 2,
                            Field1 = "Update nội dung tin bài thành công",
                            Field2 = "Tin được thay đổi: " + title + " (ID: " + id + ")",
                            Field3 = "",
                            LogId = 0
                        });

                    }
                    else
                    {
                        response.Data = returnVal;
                        response.Message = "Tin bài này không do bạn tạo ra. Bạn không có quyền chỉnh sửa tin bài này.";
                        response.Success = false;
                    }
                    #endregion
                }
                else // INSERT tin bài
                {
                    #region INSERT tin bài
                    var idReturn = OutNewBusiness.InsertOutNew(obj);

                    if (idReturn > 0) // Nếu Insert thành công thì Insert bảng ListOn
                    {
                        // Insert ListOn cho Cate Child
                        var childs = listonChild.Split(',');
                        var objlo = new OutNewListOn();
                        foreach (var cateid in childs)
                        {
                            Int32 childId = 0;
                            Int32.TryParse(cateid, out childId);
                            if (childId > 0)
                            {
                                objlo.CatId = childId;
                                objlo.IsParent = 0;
                                objlo.NewId = idReturn;
                                objlo.ListonId = 0;
                                OutNewListOnBusiness.InsertOutNewListOn(objlo);
                            }
                        }

                        // Insert ListOn cho Cate Parent
                        var parents = listonParent.Split(',');
                        foreach (var cateid in parents)
                        {
                            Int32 parentId = 0;
                            Int32.TryParse(cateid, out parentId);
                            if (parentId > 0)
                            {
                                objlo.CatId = parentId;
                                objlo.IsParent = 1;
                                objlo.NewId = idReturn;
                                objlo.ListonId = 0;
                                OutNewListOnBusiness.InsertOutNewListOn(objlo);
                            }
                        }

                    }

                    response.Data = idReturn;
                    response.Message = "Call Insert OK";
                    response.Success = true;

                    InLogBusiness.InsertInLog(new InLog
                    {
                        UserId = CurrentUser.UserId,
                        LogAction = 1,
                        Field1 = "Thêm tin bài thành công",
                        Field2 = "Tiêu đề: " + title,
                        Field3 = "",
                        LogId = 0
                    });
                    #endregion
                }

            }
            else
            {
                response.Data = -1;
                response.Message = "Param Name, Status not valid";
                response.Success = false;
            }

            return response;
        }

        private ResponseData UpdateFast(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsUpdate == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoUpdate, Success = false };

            var response = new ResponseData();

            if (!string.IsNullOrEmpty(context.Request["id"])
                && !string.IsNullOrEmpty(context.Request["title"])
                && !string.IsNullOrEmpty(context.Request["stt"]))
            {
                string title = "";
                Int32 stt = 0;
                Int32 id = 0;

                title = context.Request["title"];
                Int32.TryParse(context.Request["id"], out id);
                Int32.TryParse(context.Request["stt"], out stt);

                var obj = new OutNew()
                {
                    NewId = id,
                    NewTitle = title,
                    NewStatus = stt,
                    UserId = CurrentUser.UserId
                };

                // ID>0 là UPDATE
                if (id > 0)
                {
                    #region UPDATE tin bài

                    Int32 returnVal = -1;
                    // Check neu User la SuperAdmin ( quyền sửa tất cả ) thì cho UPDATE luôn, không cần check UserID
                    if (CurrentUser.IsSuperAdmin == 1)
                        returnVal = OutNewBusiness.UpdateFastOutNew(obj);
                    else
                        returnVal = OutNewBusiness.UpdateFastOutNewWithRole(obj);
                    // UPDATE thanh cong
                    if (returnVal > -1)
                    {
                        response.Data = returnVal;
                        response.Success = true;
                        response.Message = "Call FAST Update OK";

                        // Ghi log hệ thống
                        InLogBusiness.InsertInLog(new InLog
                        {
                            UserId = CurrentUser.UserId,
                            LogAction = 2,
                            Field1 = "Update nhanh nội dung tin bài thành công",
                            Field2 = "Tin bài được thay đổi: " + title + " (ID: " + id + ")",
                            Field3 = "",
                            LogId = 0
                        });

                    }
                    else
                    {
                        response.Data = returnVal;
                        response.Message = "Tin bài này không do bạn tạo ra. Bạn không có quyền chỉnh sửa.";
                        response.Success = false;
                    }
                    #endregion
                }
                else
                {
                    response.Data = id;
                    response.Message = "NewID <=0";
                    response.Success = false;
                }

            }
            else
            {
                response.Data = -1;
                response.Message = "Param Name, Status not valid";
                response.Success = false;
            }

            return response;
        }

        private ResponseData Delete(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsDelete == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoDelete, Success = false };

            var response = new ResponseData();
            if (!string.IsNullOrEmpty(context.Request["id"]))
            {
                var id = 0;
                Int32.TryParse(context.Request["id"], out id);
                string title = context.Request["title"];
                if (id > 0)
                {
                    Int32 returnVal = -1;
                    // Check neu User la SuperAdmin ( quyền sửa tất cả ) thì cho UPDATE luôn, không cần check UserID
                    if (CurrentUser.IsSuperAdmin == 1)
                        returnVal = OutNewBusiness.DeleteOutNew(id);
                    else
                        returnVal = OutNewBusiness.DeleteOutNewWithRole(id, CurrentUser.UserId);
                    // UPDATE thanh cong
                    if (returnVal > -1)
                    {
                        response.Data = returnVal;
                        response.Success = true;
                        response.Message = "Call Delete OK";
                        // log system 
                        InLogBusiness.InsertInLog(new InLog
                        {
                            UserId = CurrentUser.UserId,
                            LogAction = 0,
                            Field1 = "Xóa vĩnh viễn sản phẩm thành công",
                            Field2 = "Tiêu đề: " + title,
                            Field3 = "ID: " + id,
                            LogId = 0
                        });
                    }
                    else
                    {
                        response.Data = returnVal;
                        response.Message = "Tin bài này không do bạn tạo ra. Bạn không có quyền Xóa Tạm Thời tin bài này.";
                        response.Success = false;
                    }
                }
                else
                {
                    response.Data = id;
                    response.Message = "id <=0";
                    response.Success = false;
                }
            }
            else
            {
                response.Data = -1;
                response.Message = "Param not valid";
                response.Success = false;
            }
            return response;
        }

        private ResponseData Recycle(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsDelete == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoDelete, Success = false };

            var response = new ResponseData();
            if (!string.IsNullOrEmpty(context.Request["id"]))
            {
                var id = 0;
                Int32.TryParse(context.Request["id"], out id);
                string title = context.Request["title"];
                if (id > 0)
                {
                    Int32 returnVal = -1;
                    // Check neu User la SuperAdmin ( quyền sửa tất cả ) thì cho UPDATE luôn, không cần check UserID
                    if (CurrentUser.IsSuperAdmin == 1)
                        returnVal = OutNewBusiness.UpdateOutNewStatus(id, -1);
                    else
                        returnVal = OutNewBusiness.UpdateOutNewStatusWithRole(id, -1, CurrentUser.UserId);
                    // UPDATE thanh cong
                    if (returnVal > -1)
                    {
                        response.Data = returnVal;
                        response.Success = true;
                        response.Message = "Call Recycle OK";
                        // log system 
                        InLogBusiness.InsertInLog(new InLog
                        {
                            UserId = CurrentUser.UserId,
                            LogAction = 0,
                            Field1 = "Xóa tạm thời tin bài thành công",
                            Field2 = "Tiêu đề: " + title,
                            Field3 = "ID: " + id,
                            LogId = 0
                        });
                    }
                    else
                    {
                        response.Data = returnVal;
                        response.Message = "Tin bài này không do bạn tạo ra. Bạn không có quyền Xóa Tạm Thời tin bài này.";
                        response.Success = false;
                    }
                }
                else
                {
                    response.Data = id;
                    response.Message = "id <=0";
                    response.Success = false;
                }
            }
            else
            {
                response.Data = -1;
                response.Message = "Param not valid";
                response.Success = false;
            }
            return response;
        }

        private ResponseData Recover(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsUpdate == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoUpdate, Success = false };

            var response = new ResponseData();
            if (!string.IsNullOrEmpty(context.Request["id"]))
            {
                var id = 0;
                Int32.TryParse(context.Request["id"], out id);
                string title = context.Request["title"];
                if (id > 0)
                {
                    Int32 returnVal = -1;
                    // Check neu User la SuperAdmin ( quyền sửa tất cả ) thì cho UPDATE luôn, không cần check UserID
                    if (CurrentUser.IsSuperAdmin == 1)
                        returnVal = OutNewBusiness.UpdateOutNewStatus(id, 0);
                    else
                        returnVal = OutNewBusiness.UpdateOutNewStatusWithRole(id, 0, CurrentUser.UserId);
                    // UPDATE thanh cong
                    if (returnVal > -1)
                    {
                        response.Data = returnVal;
                        response.Success = true;
                        response.Message = "Call Recover OK";
                        // log system 
                        InLogBusiness.InsertInLog(new InLog
                        {
                            UserId = CurrentUser.UserId,
                            LogAction = 0,
                            Field1 = "Phục hồi tin bài thành công",
                            Field2 = "Tiêu đề: " + title,
                            Field3 = "ID: " + id,
                            LogId = 0
                        });
                    }
                    else
                    {
                        response.Data = returnVal;
                        response.Message = "Tin bài này không do bạn tạo ra. Bạn không có quyền Phục hồi tin bài này.";
                        response.Success = false;
                    }
                }
                else
                {
                    response.Data = id;
                    response.Message = "id <=0";
                    response.Success = false;
                }
            }
            else
            {
                response.Data = -1;
                response.Message = "Param not valid";
                response.Success = false;
            }
            return response;
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}